package com.xingda.packing.dmds.plc.service;

import com.alibaba.fastjson.JSONObject;
import com.xingda.packing.dmds.plc.entity.PlcItem;
import com.xingda.packing.dmds.plc.entity.PlcItemVal;

import java.util.List;

public interface PlcDirectiveService {

    /**
     * 去起始点(传送带位置)抓取
     */
    void goZeroGrab(int locationNo, int area);

    /**
     * 轮号接收完成
     */
    void receive(int productType, int area);

    /**
     * 条形码读取触发
     */
    boolean isScanSignal(int area);

    /**
     * 查询码垛完成状态
     */
    boolean isPalletizingComplete(int area);

    /**
     * 重置码垛完成为false
     */
    void resetPalletizingState(int area);

    /**
     * 重置抓取完成为false
     */
    void resetGrabState(int area);

    /**
     * 查询抓取完成状态
     */
    boolean isGrabComplete(int area);

    /**
     * 抓取起始位放置缓存位
     *
     * @param cacheLocation 缓存位编号
     */
    void startStorage(int wheelTypeCode, int cacheLocation, int area);

    /**
     * 抓取起始位放装箱位
     *
     * @param boxLocationNo 装箱位编号
     */
    void startGrab(int wheelTypeCode, int boxLocationNo, int area);

    /**
     * 抓取缓存位放装箱位
     *
     * @param cacheLocationNo 缓存位置编号
     * @param boxLocationNo   装箱位编号
     * @param productType     产品类型
     * @param wheelNo         条形码
     */
    void startCacheGrab(int cacheLocationNo, int boxLocationNo, int productType, String wheelNo, int area);

    /**
     * 查询允许下发任务状态
     */
    boolean canAssignTask(int area);

    /**
     * 读取工字轮条形码
     */
    String getScanWheelNo(int area);

    /**
     * 清除缓存位
     */
    boolean clearCacheLocationNo(int locationNo, int area);

    /**
     * 删除完成 重置缓存位状态
     */
    void resetCacheStatus(int area);

    /**
     * 写入数据
     */
    void writeVals(PlcItemVal... plcItemVals);

    /**
     * 根据地址点查询是否为True
     *
     * @param address PLC地址点
     */
    boolean isTrue(String address);

    /**
     * 读取数据
     *
     * @param plcItems 数据点数组
     */
    JSONObject readVals(PlcItem... plcItems);

    JSONObject readVals(List<PlcItem> plcItems);


    /**
     * 是否拍照完成
     *
     * @param address 装箱位PLC地址点
     */
    boolean isPhotoFinish(String address);

    /**
     * 100抓取位是否有轮
     */
    boolean is100HaveWheel(int area);

    boolean is101HaveWheel(int area);

    /**
     * 获得机器人状态(查询到码重复会停止机器人)
     *
     * @return true停止，false运行
     */
    boolean getRobotStatus(int area);

    /**
     * 分流区域触发
     */
    boolean isShuntAreaSignal(int area);

    boolean isSnapSignal(int area);

    /**
     * 获取分流区条形码
     */
    String getShuntAreaScanWheelNo(int area);

    /**
     * 分流区写值 1左2右
     */
    void writeValueToShuntArea(int location, String code, int area);

    /**
     * 分流完成
     */
    boolean isShuntOver(int area);

    /**
     * 重置分流区域触发
     */
    void restartShuntAreaSignal(int area);

    /**
     * 分流区工字轮类型
     */
    int getProductTypeToShunt(int area);

    /**
     * 抓取位高低轮
     */
    int getProductTypeToZeroGrab(int area, int locationNo);

    /**
     * 产品类别
     */
    int getProductType(int area);

    int getPalletPackingCount(String address);

    int getPalletWheelNumSet(String address);

    /**
     * MES下发任务完成
     */
    boolean getMesTask(int area);

    /**
     * 任务位置
     */
    int getTaskType(int area);

    /**
     * 下发确认抓取轮子
     */
    void grabWheel(int area);

    boolean getPlcStatus();

    void writePlcStatus();

    void codeParsingSucceeded(int area);

    void codeParsingFailed(int area);

    void snapParsingSucceeded(int area);

    void snapParsingFailed(int area);

    boolean isCodeParsingSucceeded(int area);

    boolean isCodeParsingFailed(int area);

    boolean isSnapParsingSucceeded(int area);

    boolean isSnapParsingFailed(int area);
}
